<?xml version="1.0" encoding="UTF-8"?>
<project name="android_rules" default="debug">

    <!--
        This rules file is meant to be imported by the custom Ant task:
            com.android.ant.SetupTask

        The following properties are put in place by the importing task:
            android.jar, android.aidl, aapt, aidl, and dx

        Additionnaly, the task sets up the following classpath reference:
            android.target.classpath
        This is used by the compiler task as the boot classpath.
    -->

    <!-- Custom tasks -->
    <taskdef name="aapt"
        classname="com.android.ant.AaptExecLoopTask"
        classpathref="android.antlibs" />

    <taskdef name="aidl"
        classname="com.android.ant.AidlExecTask"
        classpathref="android.antlibs" />

    <taskdef name="xpath"
        classname="com.android.ant.XPathTask"
        classpathref="android.antlibs" />

    <taskdef name="if"
        classname="com.android.ant.IfElseTask"
        classpathref="android.antlibs" />

    <!-- Properties -->

    <property name="android.tools.dir" location="${sdk.dir}/tools" />
    <!-- Name of the application package extracted from manifest file -->
    <xpath input="AndroidManifest.xml" expression="/manifest/@package"
                output="manifest.package" />
    <xpath input="AndroidManifest.xml" expression="/manifest/application/@android:hasCode"
                output="manifest.hasCode" default="true"/>

    <!-- Input directories -->
    <property name="source.dir" value="src" />
    <property name="source.absolute.dir" location="${source.dir}" />
    <property name="gen.dir" value="gen" />
    <property name="gen.absolute.dir" location="${gen.dir}" />
    <property name="resource.dir" value="res" />
    <property name="resource.absolute.dir" location="${resource.dir}" />
    <property name="asset.dir" value="assets" />
    <property name="asset.absolute.dir" location="${asset.dir}" />

    <!-- Directory for the third party java libraries -->
    <property name="external.libs.dir" value="libs" />
    <property name="external.libs.absolute.dir" location="${external.libs.dir}" />
    <!-- Directory for the native libraries -->
    <property name="native.libs.dir" value="libs" />
    <property name="native.libs.absolute.dir" location="${native.libs.dir}" />

    <!-- Output directories -->
    <property name="out.dir" value="bin" />
    <property name="out.absolute.dir" location="${out.dir}" />
    <property name="out.classes.dir" value="${out.absolute.dir}/classes" />
    <property name="out.classes.absolute.dir" location="${out.classes.dir}" />

    <!-- Verbosity -->
    <property name="verbose" value="false" />
    <!-- This is needed by emma as it uses multilevel verbosity instead of simple 'true' or 'false'
         The property 'verbosity' is not user configurable and depends exclusively on 'verbose'
         value.-->
    <condition property="verbosity" value="verbose" else="quiet">
        <istrue value="${verbose}" />
    </condition>

    <!-- Tools -->
    <condition property="exe" value=".exe" else=""><os family="windows" /></condition>

    <!-- Emma configuration -->
    <property name="emma.dir" value="${sdk.dir}/tools/lib" />
        <path id="emma.lib">
            <pathelement location="${emma.dir}/emma.jar" />
            <pathelement location="${emma.dir}/emma_ant.jar" />
        </path>
    <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
    <!-- End of emma configuration -->

    <!-- Rules -->

    <!-- Creates the output directories if they don't exist yet. -->
    <target name="-dirs">
        <echo>Creating output directories if needed...</echo>
        <mkdir dir="${resource.absolute.dir}" />
        <mkdir dir="${external.libs.absolute.dir}" />
        <mkdir dir="${gen.absolute.dir}" />
        <mkdir dir="${out.absolute.dir}" />
        <mkdir dir="${out.classes.absolute.dir}" />
    </target>

    <!-- empty default pre-build target. Create a similar target in
         your build.xml and it'll be called instead of this one. -->
    <target name="-pre-build"/>

    <!-- Generates the R.java file for this project's resources. -->
    <target name="-resource-src" depends="-dirs, -pre-build">
        <echo>Generating R.java / Manifest.java from the resources...</echo>
        <aapt executable="${aapt}"
                command="package"
                verbose="${verbose}"
                manifest="AndroidManifest.xml"
                androidjar="${android.jar}"
                rfolder="${gen.absolute.dir}">
            <res path="${resource.absolute.dir}" />
        </aapt>
    </target>

    <!-- Generates java classes from .aidl files. -->
    <target name="-aidl" depends="-dirs">
        <if condition="${manifest.hasCode}">
            <then>
                <echo>Compiling aidl files into Java classes...</echo>
                <aidl executable="${aidl}" framework="${android.aidl}"
                        genFolder="${gen.absolute.dir}">
                    <source path="${source.absolute.dir}"/>
                    <source refid="android.libraries.src"/>
                </aidl>
            </then>
            <else>
                <echo>hasCode = false. Skipping...</echo>
            </else>
        </if>
    </target>

    <!-- empty default pre-compile target. Create a similar target in
         your build.xml and it'll be called instead of this one. -->
    <target name="-pre-compile"/>

    <!-- Compiles this project's .java files into .class files. -->
    <target name="compile" depends="-resource-src, -aidl, -pre-compile"
                description="Compiles project's .java files into .class files">
        <!-- If android rules are used for a test project, its classpath should include
             tested project's location -->
        <condition property="extensible.classpath"
                           value="${tested.project.absolute.dir}/bin/classes" else=".">
            <isset property="tested.project.absolute.dir" />
        </condition>
        <condition property="extensible.libs.classpath"
                value="${tested.project.absolute.dir}/libs"
                else="./libs">
            <isset property="tested.project.absolute.dir" />
        </condition>
        <javac encoding="ascii" target="1.5" debug="true" extdirs=""
                destdir="${out.classes.absolute.dir}"
                bootclasspathref="android.target.classpath"
                verbose="${verbose}"
                classpath="${extensible.classpath}"
                classpathref="android.libraries.jars">
            <src path="${source.absolute.dir}" />
            <src path="${gen.absolute.dir}" />
            <src refid="android.libraries.src" />
            <classpath>
                <fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
                <fileset dir="${extensible.libs.classpath}" includes="*.jar" />
            </classpath>
        </javac>
    </target>

    <target name="clean" description="Removes output files created by other targets.">
        <delete dir="${out.absolute.dir}" verbose="${verbose}" />
        <delete dir="${gen.absolute.dir}" verbose="${verbose}" />
    </target>

    <target name="help">
        <!-- displays starts at col 13
              |13                                                              80| -->
        <echo>Android Ant Build. Available targets:</echo>
        <echo>   help:      Displays this help.</echo>
        <echo>   clean:     Removes output files created by other targets.</echo>
        <echo>   compile:   Compiles project's .java files into .class files.</echo>
    </target>
</project>
